package com.cari.oa.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.cari.oa.domain.SysDictItemEntity;
import com.cari.oa.util.StrUtils;

@Repository
public class SysDictItemDao extends BaseDao<SysDictItemEntity> {
	
    /**
     * 根据英文名获取系统字典项实体
     * @param enname 系统字典项英文名
     * @return 系统字典项对象
     */
    public SysDictItemEntity getByName(String name) {
        Query query = getSession().createQuery("from SysDictItemEntity where name = :name");
        query.setString("name", name);
        return (SysDictItemEntity)query.uniqueResult();
    }
    
    /**
     * 根据字典组名获取所有字典项列表
     * @param groupName 字典组英文名
     * @return 字典项列表
     */
    @SuppressWarnings("unchecked")
	public List<SysDictItemEntity> getItemsByGroupName(String groupName) {
    	String hql = "from SysDictItemEntity where groupName = :groupName and status = 0 order by value";
    	Query query = getSession().createQuery(hql);
    	query.setString("groupName", groupName);
    	return query.list();
    }

    /**
     * 判断该英文名实体对象是否存在
     * @param enname 系统字典项英文名
     * @return 是否存在
     */
    public boolean existByName(String name) {
        Query query = getSession().createQuery("select count(*) from SysDictItemEntity where name = :name");
        query.setString("name", name);
        Long count = (Long)query.uniqueResult();
        return count > 0;
    }	
    
    /**
     * 分页查询系统字典项实体对象
     * @param enname 系统字典项英文名
     * @param alias 系统字典项别名
     * @param groupName 系统字典组英文名
     * @param status 系统字典项状态
     * @param page 当前页
     * @param size 每页条数
     * @return 分页实体
     */
    public List<SysDictItemEntity> getPage(String name, String value, String groupName, Integer status, int page, int size) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("from SysDictItemEntity i where 1=1 ");

        if(StrUtils.isNotEmpty(name)) {
            stringBuilder.append("and i.name like ? ");
            params.add("%" + name + "%");
        }

        if(StrUtils.isNotEmpty(value)) {
            stringBuilder.append("and i.value like ? ");
            params.add("%" + value + "%");
        }
        
        if(StrUtils.isNotEmpty(groupName)) {
            stringBuilder.append("and i.groupName = ? ");
            params.add(groupName);
        }
        
        if(status != null) {
        	stringBuilder.append("and i.status = ? ");
        	params.add(status);
        }

        return getPage(stringBuilder.toString(), page, size, params.toArray());
    }
    
    /**
     * 查询的记录数
     * @param enname 系统字典项英文名
     * @param alias 系统字典项别名
     * @param groupName 系统字典组英文名
     * @param status 系统字典项状态
     * @param moduleName 所属模块英文名
     * @return 记录数
     */
    public long getCount(String name, String value, String groupName, Integer status) {
    	List<Object> params = new ArrayList<Object>();

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("select count(*) from SysDictItemEntity i where 1=1 ");
        
        if(StrUtils.isNotEmpty(name)) {
            stringBuilder.append("and i.name like ? ");
            params.add("%" + name + "%");
        }

        if(StrUtils.isNotEmpty(value)) {
            stringBuilder.append("and i.value like ? ");
            params.add("%" + value + "%");
        }
        
        if(StrUtils.isNotEmpty(groupName)) {
            stringBuilder.append("and i.groupName = ? ");
            params.add(groupName);
        }
        
        if(status != null) {
        	stringBuilder.append("and i.status = ? ");
        	params.add(status);
        }
        
        Query query = getSession().createQuery(stringBuilder.toString());
        for (int i = 0; i < params.size(); i++) {
            query.setParameter(i, params.get(i));
        }
        return (Long)query.uniqueResult();
    }

}
